home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s_tool / jx270inq.c < prev    next >
Text File  |  1999-06-11  |  8KB  |  317 lines

  1. #include    <TNB.h>
  2. #define    BUSYS(MM)    while( (MM)==8 )
  3. #define    DATAOUT        (0x80000000)
  4.  
  5.  
  6. int    id=13;
  7.  
  8.  
  9. main()
  10. {
  11. int    i,j,m,n,x,y,z;
  12. int    md;
  13. UNchar    buf[512];
  14.  
  15. i=S_INQUIRY(96,id,buf);
  16. dumps(buf,96);
  17.  
  18.     for(i=0;i<200;buf[i++]=0);
  19.     buf[6]=0x33;
  20. //    buf[57]=0b01111000;
  21.  
  22.     buf[30]=0x80;
  23.     buf[31]=0x80;
  24.     buf[32]=0x80;
  25.     buf[33]=0x05;
  26.     buf[34]=0x08;
  27.     buf[37]=0x03;        //Padding
  28.  
  29.     buf[48]=0xFF;
  30.     buf[49]=0x09;
  31.     buf[50]=0x60;
  32.     buf[51]=0xFF;
  33.     buf[53]=0x03;
  34.     buf[54]=0x18;
  35.     buf[55]=0x01;
  36.     buf[56]=0x84;
  37.  
  38.  
  39. //=========== set window 発行
  40. //printf("set window!!\n");
  41. buf[0]=0;
  42. buf[1]=0;
  43. //==== プリスキャン
  44. //--- 範囲設定
  45. *(int*)&buf[14]=0;            // 読み取り位置
  46. *(int*)&buf[18]=0;
  47. *(int*)&buf[22]=10224;            // 読み取り幅    最大を設定
  48. *(int*)&buf[26]=14064;            //        最大を設定
  49.  
  50. //*(int*)&buf[22]=5020;            // 読み取り幅    最大を設定
  51. //*(int*)&buf[26]=7028;            //        最大を設定
  52.  
  53.     i=232;                // DOT 指定
  54.     buf[53]=i/0x100;
  55.      buf[54]=i&0xFF;
  56.     i=480;                    // DOT 指定
  57.     buf[55]=i/0x100;
  58.      buf[56]=i&0xFF;
  59. //    *(short*)&buf[10]=0x320;
  60. //    *(short*)&buf[12]=0x320;
  61. //        buf[57]|=bit(3);            // 校正早く
  62. //--- モード設定
  63. //if ( ImageColMode==0 ){    // 0;多値 1;二値
  64.     buf[34]=0x08;                //
  65. //    if ( ImageMode==0 )            // 0;カラー 1;白黒
  66.         md=0x05;            // モード フルカラー
  67. //    else    md=0x02;            // グレイスケール
  68. //} else {
  69. //    buf[34]=0x01;                //
  70. //    if ( ImageMode==0 )            // 0;カラー 1;白黒
  71. //        md=0x03;            // カラー2値
  72. //    else    md=0x00;            // 単純2値
  73. //}
  74. buf[33]=md;
  75. //buf[37]=0x80;                // RIF=1 Padding=0
  76. //buf[37]=0x01;                // RIF=0 Padding=0
  77.  
  78. buf[65]=0x40;
  79.  
  80. dumps(buf,70);
  81.  
  82. BUSYS( i=_scsi_setwindow( id,70,buf) );
  83.  
  84. if ( i!=0 ){
  85.     if ( i==2 ){
  86.         i=request_disp(id);
  87.         if ( (i&0xFF)==5 )
  88.             return(-3);
  89.         //sprintf(buf,"SNS=%02X:ASC=%02X:ASCQ=%02X",i/0x10000,(i/0x100)&0xFF,i&0xFF );
  90.         //printf("JX エラーがでました。[set win.]\n%s\n",buf );
  91.         return(-99);
  92.     }
  93.     return(-2);
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100. }
  101.  
  102.  
  103.  
  104.  
  105.  
  106. /*************************************************
  107.         DUMP
  108. *************************************************/
  109. void    dumps(bb,ll)
  110. UNchar    *bb;
  111. int    ll;
  112. {
  113. int    i,j,m,n,c;
  114. for(j=0;j<ll;j+=16){
  115.     for(i=0;i<16;i++){
  116.         n=j+i;
  117.         if ( n>=ll )
  118.             break;
  119.         printf("%02X ",bb[n]);
  120.     }
  121.     printf("   ");
  122.  
  123.     for(i=0;i<16;i++){
  124.         n=j+i;
  125.         if ( n>=ll )
  126.             break;
  127.         c=bb[n];
  128.         if ( c<0x20 )
  129.             c='.';
  130.         else if ( c>=0x80 && c<=0x9F )
  131.             c='.';
  132.         else if ( c>=0xE0 )
  133.             c='.';
  134.         putchar(c);
  135.     }
  136.     printf("\n");
  137. }
  138. return;
  139. }
  140. /************************************************
  141.     REQUEST
  142. ************************************************/
  143. int    request_disp(id)
  144. int    id;
  145. {
  146. static char    *REQUEST_MSG[17] = {
  147.     "No Se(0): 装置には、異常は、なかった\n",
  148.     "Recovered Error (1): 装置自体のリトライ機能によりコマンドが正常に終了した\n",
  149.     "Not Ready (2): 装置自体に異常が発生し、オペレータの介入が必要であることを示"
  150.             "す\n",
  151.     "Medium Error (3): リード/ライト動作時において媒体に起因するエラーが発生し、"
  152.             "リトライでエラーが回復できなかった\n",
  153.     "Hardware Error (4): 装置のハードウェアに障害が発生し、コマンドの実行が正常終"
  154.             "了しなかった\n",
  155.     "Illegal Request(5):イニシエータからのコマンド・データに異常があり、コマンドの"
  156.             "実行ができなかった\n",
  157.     "Unit Attention (6): 装置がリセットされたことを示す。又メディアが入れ換えられた"
  158.             "ことも示す\n",
  159.     "Write Protected (7): ライト・プロテクト状態にあるときにライト動作を含むコマンド"
  160.             "を受け取ったことを示す\n",
  161.     "Blank Check (8): 読みだし中にブランク領域になった。又は、書き込み中にブランク領"
  162.             "域でない領域になった\n",
  163.     "Vendor Unique (9): メーカーごとに自由に使用可\n",
  164.     "Copy Aborted (A): Copy,Compare,Copy & Verifyコマンドがデバイス異常により中止し"
  165.             "た\n",
  166.     "Aborted Command (B): ターゲットがイニシエータからのコマンドをアボートしたこと"
  167.             "を示す\n",
  168.     "Equal (C): Searchコマンドで一致を検出した\n",
  169.     "Volume Overflow (D): データがバッファに残っているのに、デバイスは最終ブロック"
  170.             "に達してしまった\n",
  171.     "Miscompare (E): ソースデータとメディアから読み出したデータが一致しない\n",
  172.     "(F): 将来の拡張用\n",
  173.             "センス・コマンドでエラーが、発生しました。\n"
  174. };
  175. UNchar    buf[256];
  176. int    sense,sensecode,qualifier,i;
  177.     for(i=0;i<200;buf[i++]=0);
  178. if ( _scsi_request( 36, id, buf ) == 0 )
  179.     sense = (unsigned int)( buf[2] & 0x0f );
  180. else    sense = 16;
  181. sensecode=buf[12];
  182. qualifier=buf[13];
  183. printf("Check Condition!!    Sense Key = %2Xh\n",sense);
  184. printf("          Sense code(ASC) = %2Xh\n",sensecode);
  185. printf("          Qualifier(ASCQ) = %2Xh\n",qualifier);
  186. printf("               Infomation = %02X%02X%02X%02Xh\n",buf[3],buf[4],buf[5],buf[6]);
  187. printf("                         SKSV = %1Xh\n",buf[15]/0x80);
  188. printf("           Sense Key Specific = %02X%02X%02Xh\n",buf[15]&0x7F,buf[16],buf[17]);
  189. printf("       Additional Sense Bytes = %02X %02X %02X %02X\n",buf[18],buf[19],buf[20],buf[21]);
  190. //printf( REQUEST_MSG[sense] );
  191. dumps(buf,36);
  192. return( sense*0x10000+sensecode*0x100+qualifier );
  193. }
  194. /*+++++++++++++++++++++++++++++++++++++++++++*/
  195. int    request_disp2(id)
  196. int    id;
  197. {
  198. UNchar    buf[256];
  199. int    sense,sensecode,qualifier;
  200. //
  201. if ( _scsi_request( 22, id, buf ) == 0 )
  202.     sense = (unsigned int)( buf[2] & 0x0f );
  203. else    sense = 16;
  204. sensecode=buf[12];
  205. qualifier=buf[13];
  206. return( sense*0x10000+sensecode*0x100+qualifier );
  207. }
  208. /**************************************************
  209.     _scsi_setwindow(id,length,bufadds)
  210. **************************************************/
  211. int    _scsi_setwindow(id,length,bufadds)
  212. int    id,length;
  213. UNchar    *bufadds;
  214. {
  215. static    UNchar cm[10]={0x24,0+1,0,0, 0,0,  0,0,0, 0};
  216. cm[6]=(length/0x10000)&0xFF;
  217. cm[7]=(length/0x100)  &0xFF;
  218. cm[8]= length         &0xFF;
  219. return( _scsi_cmd( id, 10,cm, (length|DATAOUT),bufadds ) );
  220. }
  221. /*******************************************************
  222.  
  223.     int scsi_cmd(
  224.         int id
  225.             SCSI-id
  226.         int len
  227.             CDB の長さ
  228.         unsigned char *buf
  229.             CDB のアドレス
  230.         int rlen
  231.             データ読み込みの場合、バイト数
  232.             データ書き込みの場合、バイト数|0x80000000
  233.             0ならデータ読み込み無し
  234.         unsigned char *buf2
  235.             データアドレス
  236.  
  237. ********************************************************/
  238. int _scsi_cmd( int ID, int len, unsigned char *buf, int rlen, unsigned char *buf2 )
  239. {
  240.     int rc;
  241.     register int id asm("d4");
  242.     /* セレクションフェーズ */
  243.     id=ID;
  244.     rc  = _scsi_select( id );
  245.     if ( rc!=0 ) return(-1);
  246.     /* コマンドフェース */
  247.     buf[1]=(buf[1]&0x1F)|(id/0x10000*0x20);
  248.     rc = _scsi_cmdout( len, buf );
  249.     if ( rc!=0 ) return(-1);
  250.     if( rlen != 0 ){
  251.         if ( rlen>0 ){
  252.             /* データインフェーズ */
  253.             rc = _scsi_datain( rlen, buf2 );
  254.             if ( rc==-1 )
  255.                 return(-1);
  256.             if ( rc==-2 ){
  257.                 rc=_scsi_cmd_sm();
  258.                 if ( rc!=0 )
  259.                     return(rc);
  260.                 return(-2);
  261.             }
  262.         } else {
  263.             /* データアウトフェーズ */
  264.             rc = _scsi_dataout( rlen&0x7FFFFFFF, buf2 );
  265.             if ( rc==-1 )
  266.                 return(-1);
  267.             if ( rc==-2 ){
  268.                 rc=_scsi_cmd_sm();
  269.                 if ( rc!=0 )
  270.                     return(rc);
  271.                 return(-2);
  272.             }
  273.         }
  274.     }
  275.     return( _scsi_cmd_sm() );
  276. }
  277. /*++++++++++++++*/
  278. int _scsi_cmd_sm()
  279. {
  280.     unsigned char status,msg;
  281.     int    rc;
  282.     /* ステイタスフェーズ */
  283.     rc = _scsi_stsin( &status );
  284.     if ( rc!=0 ) return(-1);
  285.     /* メッセージフェーズ */
  286.     rc = _scsi_msgin( &msg );
  287.     if ( rc!=0 ) return(-1);
  288.     return( msg*0x10000 + status );
  289. }
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297. #if 0
  298.     i=S_INQUIRY(96,id,buf);
  299.     dumps(buf,96);
  300.     printf(" ADF とか = %02X \n",buf[36]);
  301.     printf(" Optical Resolution =  %02X \n",buf[37]);
  302.     printf(" Maximum Resolution =  %02X \n",buf[38]);
  303.     printf(" Trans. とか = %02X \n",buf[39]);
  304.     printf(" X-axis resolution(gray)  =  %04X \n",*(short*)&buf[40]);
  305.     printf(" Y-axis resolution(gray)  =  %04X \n",*(short*)&buf[42]);
  306.     printf(" X-axis resolution(color) =  %04X \n",*(short*)&buf[44]);
  307.     printf(" Y-axis resolution(color) =  %04X \n",*(short*)&buf[46]);
  308.     printf(" Maximum size to read by driver =  %04X \n",*(short*)&buf[48]);
  309.     printf(" --- \nExtend scanner ability 1 = %02X \n",buf[50]);
  310.     printf(" Extend scanner ability 2 = %02X \n",buf[51]);
  311.     printf(" Extend scanner ability 3 = %02X \n",buf[52]);
  312. #endif
  313.  
  314.  
  315.  
  316.  
  317.